<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/myblog/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/myblog/css/style.css">

<meta name="generator" content="Hexo 4.2.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/myblog/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/myblog/">Home</a>
        
          <a class="main-nav-link" href="/myblog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/myblog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main">
  
    <article id="post-6.Docker 三剑客" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/" class="article-date">
  <time datetime="2020-02-29T08:45:41.777Z" itemprop="datePublished">2020-02-29</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/">6. Docker三剑客</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h4 id="一-简单介绍"><a href="#一-简单介绍" class="headerlink" title="一. 简单介绍"></a>一. 简单介绍</h4><p>Docker的三剑客包含Compose ，Machine ，DockerSwarm。DS已经过时了，Machine也不经常用了，主要<br>使用的还是Compose。俗话说学Docker Compose必会。是docker下的一个开源项目，负责对Docker容器集群<br>的快速编排。为了完成多容器相互配合完成项目部署与应用。<br>Docker Compose 有两个比较重要的概念：  </p>
<ol>
<li>服务（service）：一个应用的容器，实际上是可以包括若干个运行相同镜像的容器实例。  </li>
<li>项目（project）：由一组相互关联的应用容器组成的一个完整的业务单元，在docker-compose.yml文件<br>中定义。  </li>
<li>Compose 默认是按照一个一个项目进行管理的，它通过子命令对项目中的一组容器进行便捷的生命周期管理。  </li>
<li>Compose 项目是由python编写的，实际上调用了Docker 服务提供的API来对容器进行管理的。因此只要<br>所操作的平台支持Docker API ，那么就可以在其上使用Compose 来进行编排管理。<h4 id="二-Compose-的下载与安装"><a href="#二-Compose-的下载与安装" class="headerlink" title="二. Compose 的下载与安装"></a>二. Compose 的下载与安装</h4>在Linux上下载安装Compose 可以直接登陆网址下载相应的版本就行了。<br>从这儿下载 <a><a href="https://github.com/docker/compose/releases" target="_blank" rel="noopener">https://github.com/docker/compose/releases</a></a>下载最新版本的。</li>
</ol>
<h4 id="三-Compose-yml文件"><a href="#三-Compose-yml文件" class="headerlink" title="三. Compose yml文件"></a>三. Compose yml文件</h4><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">"3"</span>                     <span class="string">docker_compose的</span> <span class="string">版本号</span></span><br><span class="line"><span class="attr">services:</span> </span><br><span class="line">    <span class="attr">tomcat:</span></span><br><span class="line">        <span class="attr">restart:</span> <span class="string">aloways</span>         <span class="string">是否自动重启</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">tomcat</span>            <span class="string">docker镜像名称</span></span><br><span class="line">        <span class="attr">container_name:</span> <span class="string">tomcat</span>   <span class="string">docker容器的名称</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="number">8080</span><span class="string">:8080</span>      <span class="string">宿主机端口号：镜像端口号</span></span><br></pre></td></tr></table></figure>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker compose up -----&gt; 运行docker_compose </span><br><span class="line">docker compose down -----&gt; 删除docker_compose</span><br></pre></td></tr></table></figure>
<p><strong>运行上面的这两个命令的时候，需要在docker-compose.yml 文件的文件夹路径下面才行</strong></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/" data-id="ck95pw3oo0000sad17burbp4a" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-5.Docker 容器数据持久化" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/" class="article-date">
  <time datetime="2020-02-28T09:31:16.227Z" itemprop="datePublished">2020-02-28</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">5. Docker容器数据持久化</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h4 id="一-简单介绍"><a href="#一-简单介绍" class="headerlink" title="一. 简单介绍"></a>一. 简单介绍</h4><p><strong>数据卷</strong>是一个可供一个或者多个容器使用的特殊目录。他绕过UFS，可以提供<br>很多有用的特性。  </p>
<ol>
<li>可以在多个容器之间共享和重用。</li>
<li>对数据卷的修改会立即生效。</li>
<li>对数据卷的更新不会影响容器。</li>
<li>数据卷会默认一直存在，即使容器消失或者被删除。  </li>
</ol>
<p><u>备注：使用方式上类似与Linux中目录或者文件的mount。在镜像中，被指定为<br>挂载点的文件或者目录会被隐藏掉。能够显示出来的是挂载的<strong>数据卷</strong>。</u></p>
<h4 id="二-可以在多个容器之间共享和重用"><a href="#二-可以在多个容器之间共享和重用" class="headerlink" title="二. 可以在多个容器之间共享和重用"></a>二. 可以在多个容器之间共享和重用</h4><p><u>Docker Container 对象 ：对象一旦被销毁，那么数据就不存在了；容器一旦被<br>销毁，则容器内的数据会一并被删除；服务器中的图片也会一并被删除；容器中的数据<br>不是持久化状态。</u>  </p>
<ol>
<li>docker 大体上从上到下分为三层，分别是UFS，docker，HOST OS（宿主机）。通<br>常来讲，Docker Container IO会通过UFS进行写入操作，但是UFS同时也会操作中间体<br>index.html 。   </li>
<li>那么这种方式如果发生了容器销毁或者容器删除操作，那么docker container<br>就无法发挥作用，那么就无法操作UFS，对index.html中间体进行操作了。  </li>
<li>那么所写入的数据也会消失。所以通过设立数据卷可以简化这个过程，通过docker Container 直接对index.html<br>中间体进行操作，那么该操作后中间体直接保留在宿主机的所设立的数据卷中，这样即便是容器消失<br>写出来的数据也依然存在。<h4 id="三-对数据卷的修改会立即生效"><a href="#三-对数据卷的修改会立即生效" class="headerlink" title="三. 对数据卷的修改会立即生效"></a>三. 对数据卷的修改会立即生效</h4><u>简单的介绍就是，对数据卷进行修该配置，那么该修改则会马上在容器中有所体现。</u><h4 id="四-对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除"><a href="#四-对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除" class="headerlink" title="四. 对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除"></a>四. 对数据卷的更新不会影响容器，数据卷会默认一直存在，即使容器消失或者被删除</h4><u>docker中所有的容器都是根据镜像启动的，同一个镜像，可以启动多个镜像。</u>容器启动后直接访问<br>直接去宿主机的文件就行，并不是直接写入到镜像中的。当时容器被删除的时候，该文件并不会被删除。数据卷<br>又称作docker容器的数据持久化。<h4 id="五-数据卷简单的使用举例"><a href="#五-数据卷简单的使用举例" class="headerlink" title="五. 数据卷简单的使用举例"></a>五. 数据卷简单的使用举例</h4>目标：拿tomcat为例子，创建一个index.html用于显示东西。<br>步骤：  <ol>
<li>创建一个ROOT目录作为数据卷用于替换tomcat中webapps下面的ROOT目录。  </li>
<li>在新创建的ROOT目录下新建index.html写入helloworld 文本，保存。  </li>
<li>启动容器并挂载数据卷。  <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -p <span class="number">8080</span>:<span class="number">8080</span> --name tomcat -d -v /usr/local/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat</span><br></pre></td></tr></table></figure>
解析：对于上述语句，其中 -v表示的是挂载一个数据卷 ，那么-v 之后有两个参数，左侧的是<u>宿主机</u>的<br>数据卷的目录位置，而右侧的是容器的相对应的目录位置。<h4 id="六-部署数据库"><a href="#六-部署数据库" class="headerlink" title="六. 部署数据库"></a>六. 部署数据库</h4>这里介绍的是使用的是mysql来进行举例。<br>MySql 5。7 支持NoSql；<br>MySql 8.0 支持原生分布式数据库解决方案；<br>下载mysql 5.7.22 <blockquote>
<p>docker pull mysql:5.7.22  </p>
</blockquote>
</li>
</ol>
</li>
</ol>
<p>运行MySql</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">docker run -p <span class="number">3306</span>:<span class="number">3306</span> -name mysql \                <span class="number">1</span></span><br><span class="line">-v /usr/local/docker/mysql/conf:/etc/mysql \         <span class="number">2</span></span><br><span class="line">-v /usr/local/docker/mysql/logs:/<span class="keyword">var</span>/log/mysql \     <span class="number">3</span></span><br><span class="line">-v /usr/local/docker/mysql/data:/<span class="keyword">var</span>/lib/mysql \     <span class="number">4</span></span><br><span class="line">-e MYSQL_PASSWORD=<span class="number">123456</span> \                           <span class="number">5</span></span><br><span class="line">-d mysql:<span class="number">5.7</span><span class="number">.22</span>                                      <span class="number">6</span></span><br></pre></td></tr></table></figure>
<p>1表示的是运行一个名称为mysql<br>2，3，4表示将宿主机的文件夹conf，log，lib，设置成数据卷分别对应于docker镜像的根目录下的三个目录<br>/etc/mysql，/var/log/mysql，/var/lib/mysql 。  而 -e 则表示设置环境变量。-d则是以守护态运行。<br>这个环境变量有哪些可以设置，需要去查询mysql官方文档，在mysql的官方文档里面有关于如何设置docker中相关<br>的环境变量的设置参数。<a><a href="https://hub.docker.com/_/mysql" target="_blank" rel="noopener">https://hub.docker.com/_/mysql</a></a> 该连接的文档查询。  </p>
<p>但是mysql的真正使用，需要进行一些基本的配置，而这些配置也需要进行数据卷化。  </p>
<p><u>为新创建的mysql容器设置一个最大的可接收的文件大小，设置为max_allowed_packet = 128M 大。</u><br>实际上，这个需要增加到/etc/mysql/mysql.conf.d目录下面的mysqld.cnf文件里面<br>直接追加到该文件的末尾。<br>步骤：<br>首先需要将容器启动，然后将容器的文件拷贝到宿主机中。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker cp  mysql:/etc/mysql .  ----&gt;将mysql容器中的文件加整个拷贝到宿主机当前目录中</span><br></pre></td></tr></table></figure>
<p>然后将拷贝下来目录中的配置文件 移动到 原来所设置的宿主机的目录 /usr/local/docker/<br>conf 即可，然后对该文件夹进行数据卷设置即可。<br><u>可以使用docker logs 容器名称 即可。查看容器的日志。</u><br><u>可以使用docker logs -f 容器名称 即可一直同步监听容器运行状态的日志。</u></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/" data-id="ck77i1hic0001rkd197ma6idk" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-4.Docker 常用命令" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" class="article-date">
  <time datetime="2020-02-23T07:34:26.847Z" itemprop="datePublished">2020-02-23</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">4. Docker的常用命令</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <blockquote>
<p>docker  ps  <u>【查看当前运行的】</u><br>docker  ps -a <u>【查看停止的容器】</u><br>docker  restart （容器Id）  <u>【根据容器id重启容器】</u><br>docker stop 容器id/容器名字  <u>【停止容器根据id或者名字】</u><br>docker rm 容器id <u>【删除容器 根据容器id】</u>  </p>
<p>docker run -p 8080:8080 –name tomcat tomcat <u>【<br>  启动一个容器名为tomcat的tomcat镜像：第一个tomcat是自定义的容器名，<br>  第二个tomncat是容器的镜像】  </u>  </p>
<p>docker exec -it <u>容器ID bash 【进入容器】</u><br>docker rm 容器id <u>删除容器</u><br>docker container stop 容器id/容器名称 <u>【停止容器】</u><br>docker rm -f 容器id <u>删除容器</u><br>docker container prune  <u>将所有未运行状态的容器全部删除</u></p>
</blockquote>
<h4 id="守护态运行"><a href="#守护态运行" class="headerlink" title="守护态运行"></a>守护态运行</h4><pre><code>docker run -p 8080:8080 --name tomcat -d tomcat  </code></pre><p>让docker的运行在后台运行，不让其占用宿主机的主线程。 主要就是在启动容器的时候，加上<br><strong>-d</strong> 这个标签.让容器在宿主机的后台运行。<br>如上述启动语句，表示的是以守护态运行tomcat镜像。其返回的容器id是完整的id（一般情况<br>下返回的是完整容器id的前12位。）</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -p <span class="number">8081</span>:<span class="number">8080</span> --name tomcat1 -d tomcat</span><br></pre></td></tr></table></figure>

<h4 id="进入运行状态下的容器内部"><a href="#进入运行状态下的容器内部" class="headerlink" title="进入运行状态下的容器内部"></a>进入运行状态下的容器内部</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it 容器ID bash</span><br></pre></td></tr></table></figure>
<p>当仅使用 -i 的时候，由于没有配置伪终端，界面上面没有我门熟悉的Linux页面，但是命令<br>执行结果仍然可以显示。可是当-i -t一起使用的时候可以看到我们熟悉的linux 提示符。</p>
<h4 id="删除容器"><a href="#删除容器" class="headerlink" title="删除容器"></a>删除容器</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker rm -f 容器id</span><br></pre></td></tr></table></figure>
<p>根据容器的id删除容器</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker container prune</span><br></pre></td></tr></table></figure>
<p>将所有未运行状态下的容器全部删除</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" data-id="ck77i1hi00000rkd16an01jjm" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-3.DockerFile定制镜像" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/10/3.DockerFile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/" class="article-date">
  <time datetime="2020-02-10T10:00:28.693Z" itemprop="datePublished">2020-02-10</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/10/3.DockerFile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/">3. DockerFile定制镜像</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h3 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h3><p>DockerFile定制定向的目的是为了将完成开发的应用以及其运行环境，打包称一个<br>可以在docker容器中进行运行的Docker Image 容器镜像，这样以便于一次打包多次运行<br>多平台运行的效果。<br>DockerFile <strong>是一个文本文件</strong>其内部包含了一条一条的指令，每一条指令构建一层。因此<br>每一条指令的内容就是描述该层该如何构建。<br>备注：当我们启动容器，并且想进入容器的时候，可以使用如下命令：</p>
<blockquote>
<p>dcoker exec -it tomcat容器的id bash</p>
</blockquote>
<p>该命令可以让我们 以交互的方式进入到 tomcat容器内部，对容器内部的内容进行修改或者查看。但是此时由于<br>进入了docker的tomcat容器中，所以有些命令是不能使用的，但是最基本的命令还是可以使用的例如<br>ls 或者 echo等命令。<br>此时使用命令：</p>
<blockquote>
<p>cd/webapp/Root<br>echo “Hello World Tomcat!” &gt;&gt; index.jsp</p>
</blockquote>
<p>在index.jsp页面中追加Hello World Tomcat! 这段文字，然后在查看。</p>
<p><u>以上的过程是启动容器后并在容器中进行修改的一个过程，但是这样比较麻烦，此时我们可以创建DockerFile<br>文件，对容器进行修改，然后在启动容器，这样就直接就可以生成一个达到我们使用要求的容器。</u></p>
<h3 id="创建一个简单的DockerFile文件例子"><a href="#创建一个简单的DockerFile文件例子" class="headerlink" title="创建一个简单的DockerFile文件例子"></a>创建一个简单的DockerFile文件例子</h3><p>例子如下：创建一个目录，并在该目录下创建一个dockerfile文件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir mydockerfile </span><br><span class="line">cd mydockerfile </span><br><span class="line">vi Dockerfile</span><br></pre></td></tr></table></figure>
<p>其内容为：</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">From</span> tomcat</span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> <span class="built_in">echo</span> <span class="string">"Hello World Tomcat!"</span> &gt; /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT/index.html</span></span><br></pre></td></tr></table></figure>

<p>From 制定基础的镜像，该镜像继承了tomcat镜像的所有特性，且所有的dockerfile文件第一句都是From制定基础镜像。<br>RUN 该指令是用来执行命令行指令的，由于命令行强大，run指令在定制镜像的时候是常用的一个指令。其格式通常有两种<br>一种是 <u><b> shell格式 </b></u>另外一种是 <u><b> exec格式 </b></u>   </p>
<blockquote>
<p>shell 格式 ：RUN &lt;命令&gt; ，就像直接在命令行中输入命令是一样的。在简介中写入的那些命令你就这种方式。</p>
</blockquote>
<blockquote>
<p>exec 格式： RUN [“可执行文件”,”参数1”,”参数2”] 这更像是函数调用中的格式。 </p>
</blockquote>
<p>定制完Dockerfile之后就可以创建镜像了。 </p>
<blockquote>
<p>docker build -t myshop .   myshop 表示的是标签这个可以自己随意修改，而 . 则表示的是当前目录为了告诉 dockerfile文件在何处</p>
</blockquote>
<p>上面这个是对容器中的文件进行修改，但是如果要先删除在修改呢。就需要使用WORKDIR 命令去切换工作目录才行。然而如果切换了目录进行了操作之<br>后，还需要切换回tomcat的运行目录才行，所以需要对上面的dockerfile文件进行修改。<u>需要只得注意的是 . 代表的是相对路径的根目录，表示的<br>是当前Dockerfile 文件所在的目录，而该目录也会在docker build 之后 背会docker clinet 压缩然后发送给docker server 进行解压然<br>后进行具体的docker操作。</u></p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">From</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr *</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> <span class="built_in">echo</span> <span class="string">"Hello World Tomcat!"</span> &gt; /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT/index.html</span></span><br></pre></td></tr></table></figure>
<p>然后在运行容器即可：</p>
<blockquote>
<p>docker run -p 8080:8080 myshop </p>
</blockquote>
<p>之后该运行成功的镜像，无论放到什么环境的docker中运行之后都是这种效果。</p>
<h3 id="DockerFile的指令详解"><a href="#DockerFile的指令详解" class="headerlink" title="DockerFile的指令详解"></a>DockerFile的指令详解</h3><p>dockerfile 指令除了有上面介绍的From，Run，WORKDIR还有其他的如：copy[复制文件] ，ADD[更高级的复制文件]，CMD[容器启动命令]，<br>entrypoint【入口点】env【设置环境变量】，valume【定义匿名卷】expose【报漏端口】，workdir【制定工作目录】  </p>
<h5 id="【WORKDIR】"><a href="#【WORKDIR】" class="headerlink" title="【WORKDIR】"></a>【<strong>WORKDIR</strong>】</h5><p>使用该命令来指定docker的工作目录（相当于cd的意思）。当执行过这个命令之后，以后各层的命令所执行的目录就是该语句指定的目录<br>如果该目录不存在，那么就会为你创建该目录。每一个RUN都是启动了一个容器。</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> my-shop-web-admin-1.0.1.zip . </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> unzip my-shop-web-admin-1.0.1.zip</span></span><br></pre></td></tr></table></figure>
<p>备注：copy 命令就是将该my-shop-web-admin-1.0.1.zip 拷贝到 . 也就是docker的上下文中。</p>
<p>但是执行万上面的命令的时候并不能成功创建并运行docker，因为拷贝过去的项目里面包含了ROOT目录中已经存在的东西，所以需要预先将ROOT目录<br>下面的东西给删除掉，所以需要修改命令如下。</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr * </span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> my-shop-web-admin-1.0.1.zip . </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> unzip my-shop-web-admin-1.0.1.zip</span></span><br></pre></td></tr></table></figure>
<p>但是此时还是有问题，需要把无用的zip文件给删除掉。</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr * </span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> my-shop-web-admin-1.0.1.zip . </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> unzip my-shop-web-admin-1.0.1.zip</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr my-shop-web-admin-1.0.1.zip</span></span><br></pre></td></tr></table></figure>
<p>如果需要运行tomcat依旧需要将工作目录切换回镜像本身的工作目录usr/local/tomcat才行。</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr * </span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> my-shop-web-admin-1.0.1.zip . </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> unzip my-shop-web-admin-1.0.1.zip</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr my-shop-web-admin-1.0.1.zip</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat</span></span><br></pre></td></tr></table></figure>
<h5 id="【ADD】"><a href="#【ADD】" class="headerlink" title="【ADD】"></a>【ADD】</h5><p>ADD是一个更加高级的Add指令的格式和性质与COPY基本上是一致的。但是比copy更加强大，算是一个加强版的copy吧。  </p>
<ol>
<li>这个add可以添加一个URL连接，可以拷贝网络上面的东西到docker中。在这种情况下docker引擎会试图去下载一个<br>这个连接的文件，然后放置到目标路径中去。下载后文件的全县自动设置为600（linux权限的数字表示法）如果不想要<br>其他的权限，那么就需要增加一个RUN命令去修改。  </li>
<li>但是如果add的url下载的是一个zip的话，仍然需要额外增加一层RUN命令去解压这个zip包。所以不如直接使用RUN命令<br>然后附带使用wget或者curl工具下载，处理权限，解压缩然后清理无用文件更加的合适，所以并不推荐使用add。  </li>
<li>如果源文件是一个tar的压缩文件的话，并且是压缩格式为gzip，zip2以及xz的情况下。ADD指令将会自动解压缩这个压缩<br>文件到 目标路径  </li>
<li>在copy和add的选择的时候，遵循这个原则，所有文件的复制均使用copy命令，仅仅在需要自动解压缩的场合使用add。<h5 id="【EXPOSE】"><a href="#【EXPOSE】" class="headerlink" title="【EXPOSE】"></a>【EXPOSE】</h5>格式为 EXPOSE 端口1 [端口2….]<br>expose指令是运行时候容器提供的服务端口，这只是一个声明。在运行的时候，并不会因为这个声明，应用就会开启这个端口的<br>服务。在dockerfile中写入这么一个声明的信息有两个好处  </li>
<li>帮助镜像使用者理解这个镜像服务的守护端口，以方便配置映射。</li>
<li>运行时使用随机端口映射的时候也就是 docker run -p时，会自动随机映射Expose声明的端口。<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> tomcat</span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat/webapps/ROOT</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr * </span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> my-shop-web-admin-1.0.1.zip . </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> unzip my-shop-web-admin-1.0.1.zip</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> rm -fr my-shop-web-admin-1.0.1.zip</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /usr/<span class="built_in">local</span>/tomcat </span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8080</span></span><br></pre></td></tr></table></figure>
<h5 id="【CMD指令】"><a href="#【CMD指令】" class="headerlink" title="【CMD指令】"></a>【CMD指令】</h5>CMD指令和RUN指令的格式是一样的。也是两种格式：  <blockquote>
<p>shell格式：CMD &lt;命令&gt;<br>exec格式：CMD [“可执行文件”,”参数1”,”参数2”]<br>参数列表格式： CMD [“参数1”,”参数2”……] 在指定了ENTRYPOINT指令之后，用CMD指定具体的参数</p>
</blockquote>
</li>
</ol>
<p>备注：Dockerfile 只有那么几个命令，<u>但是难的在于shell的编写。之前介绍容器的时候就说过docker不是虚拟机，<br>每一个容器就是一个进程。既然是进程，那么在启动容器的时候就需要指定所运行的程序以及参数。CMD指令就是用于指定<br>默认容器主进程的启动命令。</u>  </p>
<blockquote>
<p>EXPOSE 所暴漏的端口号，给宿主机提供了一个访问容器的端口映射途径，举例Tomcat 来说人员访问会首先访问宿主机然后<br>再通过宿主机访问docker容器，而EXPOSE 的这个端口则提示出宿主机如果要访问容器的话，直接连接容器暴漏出来的这个<br>端口即可。<br>执行  docker run -p 80:8080 tomcat<br>其中左侧的 80 是宿主机提供给访问者的访问端口，而8080 则是docker容器所暴漏出来的端口号。</p>
</blockquote>
<p>备注：如果不涉及到镜像的定制，那么就只需要会使用Docker的三剑客如Compose即可，但是如果需要定制就需要会dockerfile</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/10/3.DockerFile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/" data-id="ck6p0boqr0000tjd1fnpd5fqy" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-2.Java并发编程笔记" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/05/2.Java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/" class="article-date">
  <time datetime="2020-02-05T14:23:00.332Z" itemprop="datePublished">2020-02-05</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/05/2.Java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/">2. Java并发编程笔记</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="Java并发编程笔记2020-02-05"><a href="#Java并发编程笔记2020-02-05" class="headerlink" title="Java并发编程笔记2020-02-05"></a>Java并发编程笔记2020-02-05</h2><h3 id="简介：什么是线程安全"><a href="#简介：什么是线程安全" class="headerlink" title="简介：什么是线程安全"></a>简介：什么是线程安全</h3><p>笔记重点：线程安全的基本概念。线程安全性的分类。抛开系统性分类来区分是否线程安全。<br>定义：一个类被同时被多个线程进行调用且，不需要外部额外同步和协同的情况下，仍然能够保持内部<br>数据正确且表现出正确的行为,那么这个类就是线程安全的。原则上可以把线程安全分成五个等级。<br>1.不可变。：不可变的对象一定是线程安全的，例如final修饰的不可变类，枚举类等。javac Enum.java 类生成.class文件，然后在使用jad<br>命令去反编译该class文件可以发现这些发放在java虚拟机进行编译的时候会被加上final修饰，所以<br><strong>Enum</strong>枚举类都是线程安全的。 final只是保证值不能被覆盖。final创建的对象对所有线程完全可见，不会在创建过程中被其它线程中断并修改。但是<br>final修饰的类如果进行赋值操作的话，其值还是会被修改的。<br>例如：final 修饰list 当list调用add()方法的时候仍然会修改list的值。但是线程安全类的任意方法操作都不会使得该对象的数据处于不一致或者数据<br>污染的情况发生<br>2.线程安全。<br>3.有条件的线程安全。<br>4.线程兼容。<br>5.线程对立。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/05/2.Java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/" data-id="ck6ga3hcz0000myd18zwfccgy" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-1.Mac码云搭建个人博客" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/01/1.Mac%E7%A0%81%E4%BA%91%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/" class="article-date">
  <time datetime="2020-02-01T11:34:05.906Z" itemprop="datePublished">2020-02-01</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/01/1.Mac%E7%A0%81%E4%BA%91%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/">1. Mac码云搭建个人博客</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="Mac-码云-搭建个人博客"><a href="#Mac-码云-搭建个人博客" class="headerlink" title="Mac + 码云 搭建个人博客"></a>Mac + 码云 搭建个人博客</h2><h3 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1.准备工作"></a>1.准备工作</h3><p>需要安装好Git 软件，然后 node 环境 。</p>
<h3 id="2-步骤"><a href="#2-步骤" class="headerlink" title="2.步骤"></a>2.步骤</h3><p> 一. MyBlogs/ 在该文件夹下运行代码</p>
<p>   <code>qinglutaxuedeMacBook-Pro:MyBlogs qinglutaxue$ npm hexo</code></p>
<p> 二. 在<strong>MyBlogs</strong>目录下面新建Hexo目录</p>
<pre><code>`qinglutaxuedeMacBook-Pro:MyBlogs qinglutaxue$ cd Hexo/`

`qinglutaxuedeMacBook-Pro:MyBlogs qinglutaxue$ hexo init Hexo/`</code></pre><p> 三. 生成静态页面(每次更新都需要运行这个来生成新的页面)</p>
<pre><code>`qinglutaxuedeMacBook-Pro:Hexo qinglutaxue$ hexo g`</code></pre><p> 四. 启动本地服务</p>
<pre><code>`qinglutaxuedeMacBook-Pro:Hexo qinglutaxue$ hexo s`</code></pre><p> 五. 一件部署到GitPages上<br>    <code>qinglutaxuedeMacBook-Pro:Hexo qinglutaxue$ hexo deploy</code></p>
<p>参考文章：<a href="https://www.jianshu.com/p/13f5e4d7099d" target="_blank" rel="noopener">https://www.jianshu.com/p/13f5e4d7099d</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/01/1.Mac%E7%A0%81%E4%BA%91%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/" data-id="ck6ga3hd90001myd1h70yc7pf" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-hello-world" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/myblog/2020/02/01/hello-world/" class="article-date">
  <time datetime="2020-02-01T11:02:29.047Z" itemprop="datePublished">2020-02-01</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/myblog/2020/02/01/hello-world/">Hello World</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>

<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>

<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>

<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>

<p>More info: <a href="https://hexo.io/docs/one-command-deployment.html" target="_blank" rel="noopener">Deployment</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2020/02/01/hello-world/" data-id="ck63j0ws000005ad13p324sve" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  


</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/myblog/archives/2020/02/">February 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/myblog/2020/02/29/6.Docker%20%E4%B8%89%E5%89%91%E5%AE%A2/">6. Docker三剑客</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/28/5.Docker%20%E5%AE%B9%E5%99%A8%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">5. Docker容器数据持久化</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/23/4.Docker%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/">4. Docker的常用命令</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/10/3.DockerFile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/">3. DockerFile定制镜像</a>
          </li>
        
          <li>
            <a href="/myblog/2020/02/05/2.Java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/">2. Java并发编程笔记</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 John Doe<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/myblog/" class="mobile-nav-link">Home</a>
  
    <a href="/myblog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/myblog/fancybox/jquery.fancybox.css">

  
<script src="/myblog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/myblog/js/script.js"></script>




  </div>
</body>
</html>